#ifndef SRC_JIMGUTIL_H_
#define SRC_JIMGUTIL_H_
#include  <stdint.h>
#ifndef JIMGUTIL_DLL_DECL
#  if defined(_WIN32) && !defined(__CYGWIN__) && !defined(JIMGUTIL_STATIC)
#    if defined(JIMGUTIL_EXPORTS)
#      define JIMGUTIL_DLL_DECL  __declspec(dllexport)
#    else
#      define JIMGUTIL_DLL_DECL  __declspec(dllimport)
#    endif
#  else
#    define JIMGUTIL_DLL_DECL
#  endif
#endif

#define JIMGUTIL_OK 0
#define JIMGUTIL_NULL_POINTER -1
#define JIMGUTIL_INVALID_INPUT_SIZE -2
#define JIMGUTIL_INVALID_OUTPUT_SIZE -3
#define JIMGUTIL_INVALID_BPP -4
#define JIMGUTIL_INVALID_ANGLE -5
#define JIMGUTIL_REQUIRED_EVEN_WH -6
#define JIMGUTIL_INVALID_MATRIX_TYPE -7
#define JIMGUTIL_INVALID_ARUGMENT -8

#ifdef __cplusplus
extern "C" {
#endif
//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGBA2BGR
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGBA2RGB
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGBA2GRAY
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGB2BGR
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_swap3byte
(uint8_t* input, int input_len, int width, int height, int stride);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGB2GRAY
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_BGR2RGBA
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int stride
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGB2RGBA
(const uint8_t* input, int input_len, int width, int height, int stride, uint8_t* output, int output_len);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int bpp
// @param    int angle
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_rotate
(uint8_t* input, int input_len, int width, int height, int bpp, int angle);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int bpp
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_hflip
(uint8_t* input, int input_len, int width, int height, int bpp);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int bpp
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_vflip
(uint8_t* input, int input_len, int width, int height, int bpp);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_NV212RGB
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_NV212BGR
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_NV212RGBA
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGB2NV21
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_BGR2NV21
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    const uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    uint8_t * output
// @param    int output_len
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_RGBA2NV21
(const uint8_t* input, int input_len, int width, int height, uint8_t* output, int output_len);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @param    int angle
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_nv21Rotate
(uint8_t* input, int input_len, int width, int height, int angle);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_nv21Hflip
(uint8_t* input, int input_len, int width, int height);

//************************************
// 
// @param    uint8_t * input
// @param    int input_len
// @param    int width
// @param    int height
// @return   JIMGUTIL_DLL_DECL int
//************************************
JIMGUTIL_DLL_DECL int jimgutil_nv21Vflip
(uint8_t* input, int input_len, int width, int height);

#ifdef __cplusplus
}
#endif
#endif /** SRC_JIMGUTIL_H_ */
